/*
    P241 書籍貸出クラス
*/
package book;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.DBManager;
import common.TableManager;

public class RentalEntryServlet extends HttpServlet {

//	ResultSet rs 		= null;


//	遷移先P202,P241 &P202にて表示するエラーメッセージ
	String PATH_P202 =  "/book/SearchServlet";
	String PATH_P241 =  "userBookRental.jsp";
	String PATH_P151 =  "/book/ReserveListServlet";
	String path 	= null;
	String message 	= null;


@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			                            throws ServletException, IOException {
		doPost(req, resp);
	}

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
										throws ServletException, IOException {

			//入力パラメータのエンコーディング
			req.setCharacterEncoding("UTF-8");
			resp.setContentType("text/html;charset=UTF-8");

			Connection con = null;
			Statement smt = null;

			//書籍検索結果(P202/P151)からパラメータを取得する

			String id = (String)req.getParameter("id"); //P202からの書籍ID
			//書籍idをAttributeから取得するように変更 2013/10/17 髙山
			//String bookId = (String)req.getParameter("bookId"); //P151からの書籍ID
			String bookId = (String)req.getAttribute("bookId"); //書籍ID

			if(bookId  != null){
				id = bookId;
			}

			//予約者一覧(P151)からパラメータを取得する
			//書籍IDは上記記載
			//利用者id、予約者idをAttributeから取得するように変更 2013/10/17 髙山
			//String member_id = (String)req.getParameter("memberId");   //利用者ID
			//String reserve_id = (String)req.getParameter("reserveId"); //予約ID
			String member_id = (String)req.getAttribute("memberId");
			String reserve_id = (String)req.getAttribute("reserveId");
			req.setAttribute("member_id",member_id);
			req.setAttribute("reserve_id",reserve_id);

			//書籍IDが未選択の場合
			//P202の書籍検索結果画面のエラーメッセージBoxに「書籍が選択されていません」を表示
			String message;
			if(id == null){
				path = PATH_P202;
				message = "書籍を選択してください。";
			}else{
			//	int book_id = Integer.parseInt(id);

				//書籍テーブルから書籍IDが一致するレコードを検索する
				//	BookBean book = getBookInfomation(book_id);
				BookBean book = (BookBean)TableManager.getRecord(TableManager.BOOKS_TABLE, Integer.parseInt(id)).getBean();

				/*レコードが存在した場合
				  以下の項目をリクエスト情報にセットする
							・タイトル
							・著者名
							・ISBN
							・発行年月日
							・内容
							・書籍画像
							・出版者名
							・ジャンル名
				*/
					path = PATH_P241;
				//	ＩＳＢＮが一致する書籍の中で、貸し出していない書籍（ＩＤ)に差し替える。	2013.10.17	若林
				//	req.setAttribute("book", book);
				//公開＝1、非公開＝0
				String sql_isbn = "select * from books where delete_flag=0 and open_flag=1 and isbn = '" + book.getIsbn() + "'";
				String sql_reserve = "select count(*) as cnt from reserves where book_isbn = ?";
				String sql_reserve_no = "select member_id from reserves where book_isbn = ? order by reserve_date limit 1";


				/*所蔵数をリクエスト情報にセットする
				  書籍テーブルからISBNが同一のレコード件数を検索し所蔵数とする
				  書籍テーブルからISBNが同一のレコードを検索する
				*/
				int stock_books        = 0;  //所蔵数
				int rental_books       = 0;  //貸出中冊数
				int reserve_books      = 0;  //予約数
				int rental_numberbooks = 0;  //貸出可能冊数

				try{
					//DB呼び出し
					con = DBManager.getConnection();

					PreparedStatement sql = con.prepareStatement(sql_reserve);
					PreparedStatement reserve_no = con.prepareStatement(sql_reserve_no);

					Statement stm = con.createStatement();
					ResultSet rs = stm.executeQuery(sql_isbn);

					while (rs.next()) {
						System.out.println("isbn : " + rs.getString("isbn") + " book_id : " + rs.getInt("id"));

						//所蔵数 ＝ レコード件数
						stock_books++;

						//貸出中冊数 ＝ 貸出IDがセットされているレコード件数
						if (rs.getInt("rental_id") > 0) {
							System.out.println("isbn : " + rs.getString("isbn") +
											   " book_id : " + rs.getInt("id") +
											   " rental_id : " + rs.getInt("rental_id"));
							rental_books++;
						}
						//	ＩＳＢＮが一致する書籍の中で、貸し出していない書籍（ＩＤ)に差し替える。	2013.10.17	若林
						else {
							book.setId(rs.getInt("id"));
						}

					}
					//予約数 ＝ 検索結果のレコードの書籍ＩＤで予約テーブルを検索し、該当するレコード件数を予約数
					sql.setString(1, book.getIsbn());
					ResultSet rs_rsv = sql.executeQuery();
					if (rs_rsv.next()) {

						reserve_books = rs_rsv.getInt("cnt");
					}

					//貸出可能冊数 ＝ 所蔵数 - 貸出中冊数 - 予約数
					rental_numberbooks = stock_books - rental_books - reserve_books;
					if(rental_numberbooks < 0){
						rental_numberbooks = 0;
					}

					//予約者一覧(P151)からの遷移の場合
					//予約が古い順に書籍貸出
					if (reserve_id != null ){
						int reserveOk =0;
						reserve_no.setString(1, book.getIsbn());
						ResultSet rs_reserve_no = reserve_no.executeQuery();
						if (rs_reserve_no.next()) {

							reserveOk = rs_reserve_no.getInt("member_id");
						}
						if(reserveOk == Integer.parseInt(member_id)){
							reserve_books--;
							rental_numberbooks++;
						}
					}
				}
				catch (SQLException e) {
					e.printStackTrace();
				}
				/*以下の項目をリクエスト情報にセットする
		        ・所蔵数
				・貸出中冊数
				・予約数
				・貸出可能冊数
				 */
				req.setAttribute("stock_books", stock_books);
				req.setAttribute("rental_books", rental_books);
				req.setAttribute("reserve_books", reserve_books);
				req.setAttribute("rental_numberbooks", rental_numberbooks);

/*
					ﾕｰｻﾞ管理IDの入力処理
			    	member_id = req.getParameter( "user_id" );
					String error_message = null;
					未入力の確認
					if((member_id == null || member_id.equals(""))){
						error_message = "※ﾕｰｻﾞ管理IDを入力してください";
					}
					req.setAttribute( "error_message" , error_message );
*/

				//貸出日をリクエスト情報にセットする
				//貸出可能冊数が存在する場合、貸出日は今日の日付
				// 現在日付の取得
				Calendar cal = Calendar.getInstance();
				int year = cal.get(Calendar.YEAR);
				int month = cal.get(Calendar.MONTH)+1;
				int today = cal.get(Calendar.DATE);
				String time = year +"-"+ month + "-" + today + "";

				//返却予定日をリクエスト情報にセットする
				//返却予定日 ＝ 貸出日 + 14（日）
				String return_plan_date ;

			    //今日の日付から14にち足す
			    cal.add(Calendar.DATE, +14);
			    int y = cal.get(cal.YEAR);
			    int m = cal.get(cal.MONTH) + 1;
			    int d = cal.get(cal.DATE);
			    return_plan_date = y + "-" + m + "-" + d + "";

				req.setAttribute("rental_date", time );
				req.setAttribute("return_plan_date", return_plan_date );

				//	ＩＳＢＮが一致する書籍の中で、貸し出していない書籍（ＩＤ)に差し替える。	2013.10.17	若林
				req.setAttribute("book", book);

				//書籍貸出(P241)へ画面遷移
				RequestDispatcher dispatcher = req.getRequestDispatcher(path);
				dispatcher.forward(req,resp);

		}
	}

}
